package com.example.tools;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * 什么是可阻塞队列，阻塞队列的作用与实际应用，阻塞队列的实现原理。
 * 阻塞队列与Semaphore有些相似，但也不同，阻塞队列是一方存放数据，另一方释放数据，Semaphore通常则是由同一方设置和释放信号量。
 *
 * ArrayBlockingQueue 只有put方法和take方法才具有阻塞功能
 *
 * 用3个空间的队列来演示阻塞队列的功能和效果。
 */
public class BlockQueueTest {
    public static void main(String[] args) {
        final BlockingQueue blockingQueue = new ArrayBlockingQueue(3);
        for(int i=1;i<=2;i++){
            new Thread(new Runnable() {

                public void run() {

                    while(true){
                        try {
                            Thread.sleep((long) (Math.random()*10000));
                            System.out.println(Thread.currentThread().getName()+"准备放数据");
                            blockingQueue.put(1);
                            System.out.println(Thread.currentThread().getName()+"放数据成功"+"当前队列有"+blockingQueue.size()+"个数据");

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                }
            }).start();
        }

        new Thread(new Runnable() {

            public void run() {
                while(true){
                    try {
                        Thread.sleep((long) (Math.random()*10000));
                        System.out.println(Thread.currentThread().getName() + "准备取数据!");
                        blockingQueue.take();
                        System.out.println(Thread.currentThread().getName()+"取数据成功"+"当前队列有"+blockingQueue.size()+"个数据");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}
